///******************** NG.Respate(C)  **********************************
//* 产品名称: Respate 科技
//* 文件名称: daemon.c
//* 程序作者: 雷帕特公司(南宫子萍)
//* 程序版本: V1.1														   
//* 编制日期: 2019/1/29
//* 功能描述: 守护进程
//* QQ:	2085827949
//**********************************************************************/

#include "lap_lib.h"

//#include <sys/types.h>
//#include <unistd.h>
//#include <stdlib.h>
//#include <stdio.h>
//#include <sys/stat.h>
//#include <fcntl.h>

 
//函数实现以下6点 便可以成为守护进程
/*
**	1.父进程先于子进程退出
**	2.子进程使用 setsid函数创建新的会话期，脱离控制台
**	3.调用 chdir 将当前工作目录设置为根目录'/'
**	4.umask设置为0 用于取消任何文件权限屏蔽
**	5.关闭所有文件描述符
**	6.将0、1、2 重定位到 /dev/null	(垃圾箱)
*/

/*********************************************************************************
** 函数名称: lap_daemon
** 功能描述: 将调用该函数的进程变为一个守护进程
** 输入参数: None.        
** 输出参数: None.
** 返回参数: return response .
**********************************************************************************/
void lap_daemon(void)
{	
	pid_t pid;

	//子进程使用 setsid函数创建新的会话期，脱离控制台
	pid = setsid();
	if(0 > pid)
	{
		 perror("setsid erro\n");
		exit(-1);
	}

	//调用 chdir 将当前工作目录设置为根目录'/'
	chdir("/~");

	//umask设置为0 用于取消任何文件权限屏蔽
	umask(0);

	//关闭所有文件描述符
	int cnt  = sysconf(_SC_OPEN_MAX);	//获取进程最大打开文件数目
	int i = 0;
	for (i=0;i<cnt;i++) close(i);

	//将0、1、2 (输入，输出，错误)重定位到 /dev/null	(垃圾箱)
	open("/dev/null",O_RDWR);
	open("/dev/null",O_RDWR);
	open("/dev/null",O_RDWR);
	
}

















#if 0	//功能测试
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	pid_t pid = -1;
	pid = fork();
	if( pid < 0 )		//子线程创建错误	
	{
		return -1;
	}
	else if( pid > 0 )	//父线程
	{
		printf("Parent fork  \n");
		return 0;
	}
		
	lap_daemon();
	while (1)
	{
		
	}
	
	return 0;
}
#endif







																						 
